# -*- coding: utf-8 -*-
from setuphelpers import *
from time import sleep

WAPT_DIR = makepath(programfiles32, "wapt")
WAPT_INI = makepath(WAPT_DIR, "wapt-get.ini")
WAPT_INI_BAK = makepath(WAPT_DIR, "wapt-get.ini.bak_serveur_wapt2")
WAPT_INI_TMPL = makepath(WAPT_DIR, "wapt-get.ini.tmpl")
WAPT_INI_TMPL_BAK = makepath(WAPT_DIR, "wapt-get.ini.tmpl.bak_serveur_wapt2")
WAPT_DB = makepath(WAPT_DIR, "db", "waptdb.sqlite")
WAPT_SERVICE = "WAPTService"

OLD_REPO = "https://serveur_wapt2.chezmoi.fr/wapt"
OLD_SERVER = "https://serveur_wapt2.chezmoi.fr"

NEW_REPO = "https://serveur_wapt.chezmoi.fr/wapt"
NEW_SERVER = "https://serveur_wapt.chezmoi.fr"


def log_info(message):
    print(u"[INFO] {}".format(message))


def log_warn(message):
    print(u"[WARN] {}".format(message))


def log_error(message):
    print(u"[ERROR] {}".format(message))


def safe_stop_service(service_name):
    try:
        service_stop(service_name)
        log_info(u"Service arrete : {}".format(service_name))
        sleep(3)
        return True
    except Exception as e:
        log_error(u"Impossible d'arreter {} : {}".format(service_name, e))
        return False


def safe_start_service(service_name):
    try:
        service_start(service_name)
        log_info(u"Service demarre : {}".format(service_name))
        sleep(3)
        return True
    except Exception as e:
        log_error(u"Impossible de demarrer {} : {}".format(service_name, e))
        return False


def backup_file(src, dst):
    try:
        if isfile(src) and not isfile(dst):
            filecopyto(src, dst)
            log_info(u"Sauvegarde creee : {}".format(dst))
        elif isfile(dst):
            log_info(u"Sauvegarde deja presente : {}".format(dst))
        else:
            log_warn(u"Fichier absent avant sauvegarde : {}".format(src))
        return True
    except Exception as e:
        log_error(u"Erreur de sauvegarde {} -> {} : {}".format(src, dst, e))
        return False


def patch_file_by_replace(path):
    if not isfile(path):
        log_warn(u"Fichier absent, patch ignore : {}".format(path))
        return True

    try:
        with open(path, "r") as f:
            content = f.read()
    except Exception as e:
        log_error(u"Lecture impossible de {} : {}".format(path, e))
        return False

    old_content = content

    content = content.replace(OLD_REPO, NEW_REPO)
    content = content.replace(OLD_SERVER, NEW_SERVER)

    if content == old_content:
        log_warn(u"Aucune occurrence remplacee dans {}".format(path))
    else:
        log_info(u"Occurrences remplacees dans {}".format(path))

    try:
        with open(path, "w") as f:
            f.write(content)
    except Exception as e:
        log_error(u"Ecriture impossible de {} : {}".format(path, e))
        return False

    # verification immediate
    try:
        with open(path, "r") as f:
            verify = f.read()
    except Exception as e:
        log_error(u"Relecture impossible de {} : {}".format(path, e))
        return False

    if OLD_REPO in verify or OLD_SERVER in verify:
        log_error(u"Anciennes valeurs encore presentes dans {}".format(path))
        return False

    if NEW_REPO not in verify or NEW_SERVER not in verify:
        log_error(u"Nouvelles valeurs absentes dans {}".format(path))
        return False

    log_info(u"Verification OK : {}".format(path))
    return True


def remove_db():
    try:
        if isfile(WAPT_DB):
            remove_file(WAPT_DB)
            log_info(u"Base supprimee : {}".format(WAPT_DB))
        else:
            log_info(u"Base absente : {}".format(WAPT_DB))
        return True
    except Exception as e:
        log_warn(u"Suppression DB impossible : {}".format(e))
        return False


def install():
    log_info(u"=== Debut migration serveur_wapt2 -> serveur_wapt ===")

    if not isfile(WAPT_INI):
        error(u"Fichier ini introuvable : {}".format(WAPT_INI))

    if not safe_stop_service(WAPT_SERVICE):
        error(u"Arret du service WAPT impossible")

    if not backup_file(WAPT_INI, WAPT_INI_BAK):
        error(u"Sauvegarde du fichier INI impossible")

    if isfile(WAPT_INI_TMPL):
        if not backup_file(WAPT_INI_TMPL, WAPT_INI_TMPL_BAK):
            error(u"Sauvegarde du fichier INI template impossible")

    if not patch_file_by_replace(WAPT_INI):
        error(u"Mise a jour du fichier INI impossible")

    if isfile(WAPT_INI_TMPL):
        if not patch_file_by_replace(WAPT_INI_TMPL):
            error(u"Mise a jour du fichier INI template impossible")

    remove_db()

    if not safe_start_service(WAPT_SERVICE):
        error(u"Redemarrage du service WAPT impossible")

    log_info(u"=== Fin migration serveur_wapt2 -> serveur_wapt ===")


def audit():
    issues = []

    for path in (WAPT_INI, WAPT_INI_TMPL):
        if not isfile(path):
            continue

        try:
            with open(path, "r") as f:
                content = f.read()
        except Exception as e:
            issues.append(u"lecture impossible de {} : {}".format(path, e))
            continue

        if OLD_SERVER in content:
            issues.append(u"ancien wapt_server encore present dans {}".format(path))

        if OLD_REPO in content:
            issues.append(u"ancien repo_url encore present dans {}".format(path))

        if NEW_SERVER not in content:
            issues.append(u"nouveau wapt_server absent dans {}".format(path))

        if NEW_REPO not in content:
            issues.append(u"nouveau repo_url absent dans {}".format(path))

    if issues:
        return u"WARNING: " + u" | ".join(issues)

    return u"OK: migration ini vers serveur_wapt valide"